﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using DataAccessComponents;
using System.IO;
using System.Windows.Media.Imaging;
using System.Collections.ObjectModel;
using System.Drawing;

namespace BusinessLogicLayer
{
    public class ZdjecieBL : IBusinessLogicLayer<Zdjecie>
    {
        private DbOperations dal = new DbOperations();

        /// <summary>
        /// Funkcja dodawająca zdjecie do bazy danych
        /// </summary>
        /// <param name="nazwaZdjecia">Nazwa dla zdjecia</param>
        /// <param name="sciezka">Ścieżka do zdjecia</param>
        /// <returns></returns>
        public int dodaj(string nazwaZdjecia,string sciezka)
        {
            //Odczytywanie zdjecia i zamienianie na jego na strumień bajtów
            FileStream fs = new FileStream(sciezka, FileMode.Open, FileAccess.Read);

            // Pobieranie obrazka i zmiana wymiarów
            Image imageZrodlo = Image.FromFile(sciezka);
            Size rozmiar = new Size(640,480);
            imageZrodlo = zmienRozmiarImage(imageZrodlo, rozmiar);

            // Przekształcenie do MemoryStream
            MemoryStream ms = new MemoryStream();
            imageZrodlo.Save(ms,System.Drawing.Imaging.ImageFormat.Png);
            ms.Position = 0;

            // Zapisanie stream to byte[]
            byte[] data = ms.ToArray();            

            Zdjecie tmpZdjecie = new Zdjecie(0, data, nazwaZdjecia);
                
            return dal.dodajZdjecie(tmpZdjecie);
        }

        private Image zmienRozmiarImage(Image imgDoZmiany,Size rozmiar)
        {
            int zrodloSzerokosc = (int)imgDoZmiany.Width;
            int zrodloWysokosc = (int)imgDoZmiany.Height;

            float nPercent = 0;
            float nPercentSzerokosc = 0;
            float nPercentWysokosc = 0;

            nPercentSzerokosc = ((float)rozmiar.Width / (float)zrodloSzerokosc);
            nPercentWysokosc = ((float)rozmiar.Height / (float)zrodloWysokosc);

            if (nPercentWysokosc < nPercentSzerokosc)
                nPercent = nPercentWysokosc;
            else
                nPercent = nPercentSzerokosc;

            int docelowaSzerokosc = (int)(zrodloSzerokosc * nPercent);
            int docelowaWysokosc = (int)(zrodloWysokosc * nPercent);

            Bitmap b = new Bitmap(docelowaSzerokosc, docelowaWysokosc);
            Graphics g = Graphics.FromImage((System.Drawing.Image)b);

            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(imgDoZmiany, 0, 0, docelowaSzerokosc, docelowaWysokosc);
            g.Dispose();

            return (System.Drawing.Image)b;
        }

        /// <summary>
        /// Funkcja usuwająca zdjecie z bazy danych
        /// </summary>
        /// <param name="idusun">Id zdjecie do usunięcia</param>
        public void usun(int idusun)
        {
            dal.usunZdjecie(idusun);
        }

        /// <summary>
        /// Funkcja akutualizująca zdjecie w bazie danych
        /// </summary>
        /// <param name="objAktualizuj">Obiekt zdjecie zawierający inforamacje do aktualizacji</param>
        public void aktualizuj(Zdjecie objAktualizuj)
        {
            dal.aktualizujZdjecie(objAktualizuj);
        }

        /// <summary>
        /// Pobiera zdjecie na podstawie id zdjecie
        /// </summary>
        /// <param name="idusun">Id zdjecie</param>
        /// <returns>Obiekt Zdjecie</returns>
        public Zdjecie pobierz(int idpobierz)
        {            
            return dal.pobierzZdjecie(idpobierz);
        }

        /// <summary>
        /// Funkcja zwraca obiekt bitmapImage
        /// </summary>
        /// <param name="idusun">Id zdjecia</param>
        /// <returns>Obietk BitmapImage</returns>
        public BitmapImage pobierzBitmapImage(int idzdjecie)
        {
            Zdjecie zdjecie = dal.pobierzZdjecie(idzdjecie);
            byte[] data = zdjecie.Zdjecie1;
            BitmapImage bi = new BitmapImage();
            if (idzdjecie > 0)
            {
                MemoryStream strm = new MemoryStream();
                strm.Write(data, 0, data.Length);
                strm.Position = 0;

                System.Drawing.Image img = System.Drawing.Image.FromStream(strm);
                                
                bi.BeginInit();
                MemoryStream ms = new MemoryStream();
                img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
                ms.Seek(0, SeekOrigin.Begin);
                bi.StreamSource = ms;
                bi.EndInit();               
            }
            return bi;
            
        }

        /// <summary>
        /// Funkcja zwraca liste zdjęć
        /// </summary>
        /// <param name="idGaleria">Id galeri z której maja byc pobrane zdjecia</param>
        /// <returns>Kolekcje obiektów Zdjecie</returns>
        public ObservableCollection<Zdjecie> pobierzListe(int idGaleria)
        {
            return dal.pobierzListeZdjecie(idGaleria);
        }

        /// <summary>
        /// Funkcja zwraca liste zdjęć
        /// </summary>
        /// <param name="idGaleria">Id galeri z której maja byc pobrane zdjecia</param>
        /// <returns>Kolekcje obiektów BitmapImage</returns>
        public ObservableCollection<BitmapImage> pobierzListeZdjecieBitmapImage(int idGaleria)
        {
            ObservableCollection<BitmapImage> listaBitmap = new ObservableCollection<BitmapImage>();
            foreach (Zdjecie zdjecie in dal.pobierzListeZdjecie(idGaleria))
            {
                listaBitmap.Add(pobierzBitmapImage(zdjecie.Id_zdjecia));
            }
            return listaBitmap;
        }

        public int dodaj(Zdjecie objDodaj)
        {
            throw new NotImplementedException();
        }

        public ObservableCollection<Zdjecie> pobierzListe()
        {
            throw new NotImplementedException();
        }

        public bool aktualizujListe(ObservableCollection<Zdjecie> lista)
        {
            throw new NotImplementedException();
        }

        public bool usun(ObservableCollection<Zdjecie> lista)
        {
            foreach (Zdjecie zdjecie in lista)
            {
                if (zdjecie.Id_zdjecia != 0)
                {
                    usun(zdjecie.Id_zdjecia);
                }
            }
            return true;
        }
    }
}
